package com.ssy.lingxi.contract.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.contract.api.model.vo.request.ContractOrderAmountLogRequest;
import com.ssy.lingxi.contract.model.vo.common.response.PageItemVO;
import com.ssy.lingxi.contract.model.vo.manage.request.*;
import com.ssy.lingxi.contract.model.vo.manage.response.ContractCompleteQueryVO;
import com.ssy.lingxi.contract.model.vo.manage.response.ContractManageDetailVO;
import com.ssy.lingxi.contract.model.vo.manage.response.ContractManageInfoVO;
import com.ssy.lingxi.contract.model.vo.manage.response.ContractManageQueryVO;

import java.util.List;

/**
 * 合同管理接口定义
 * @author 伍将
 * @date 2021/2/2
 * @version 2.0.0
 */
public interface IContractManageService {

    /**
     * 分页查询合同列表
     * @author 伍将
     * @date 2021/2/2
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractManageQueryVO>> pageList(UserLoginCacheDTO user, ContractManagePageVO pageVO);

    /**
     * 查询合同详情
     * @author 伍将
     * @date 2021/2/7
     * @param user: 当前登录用户
     * @param contractId: 合同id
     * @return 操作结果
     **/
    Wrapper<ContractManageDetailVO> getDetail(UserLoginCacheDTO user, Long contractId);

    /**
     * 合同作废
     * @author 伍将
     * @date 2021/2/7
     * @param user: 当前登录用户
     * @param invalidVO: 作废请求参数
     * @return 操作结果
     **/
    Wrapper <Void>invalid(UserLoginCacheDTO user, ContractManageInvalidVO invalidVO);

    /**
     * 保存合同
     * @author 伍将
     * @date 2021/2/24
     * @param user: 当前登录用户
     * @param saveVO: 保存参数
     * @return 操作结果
     **/
    Wrapper<Long> save(UserLoginCacheDTO user, ContractUpdateVO saveVO);

    /**
     * 分页查询待提新增合同列表
     * @author 伍将
     * @date 2021/2/3
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractManageQueryVO>> pageToBeAdd(UserLoginCacheDTO user, ContractManageCommonPageVO pageVO);

    /**
     * 提交合同
     * @author 伍将
     * @date 2021/2/3
     * @param user: 当前登录用户
     * @param submitVO: 提交请求参数
     * @return 操作结果
     **/
    Wrapper<Void> submit(UserLoginCacheDTO user, ContractManageSubmitVO submitVO);

    /**
     * 删除合同
     * @author 伍将
     * @date 2021/2/3
     * @param user: 当前登录用户
     * @param deleteVO: 删除请求参数
     * @return 操作结果
     **/
    Wrapper<Void> delete(UserLoginCacheDTO user, ContractManageDeleteVO deleteVO);

    /**
     * 分页查询待提交审核合同列表
     * @author 伍将
     * @date 2021/2/2
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractManageQueryVO>> pageToBeSubmitExamine(UserLoginCacheDTO user, ContractManageCommonPageVO pageVO);

    /**
     * 提交审核
     * @author 伍将
     * @date 2021/2/3
     * @param user:当前登录用户
     * @param examineVO:审核请求参数
     * @return 操作结果
     **/
    Wrapper<Void> submitExamine(UserLoginCacheDTO user, ContractManageExamineVO examineVO);

    /**
     * 分页查询待审核一级合同列表
     * @author 伍将
     * @date 2021/2/2
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractManageQueryVO>> pageToBeExamineStepOne(UserLoginCacheDTO user, ContractManageCommonPageVO pageVO);

    /**
     * 一级审核
     * @author 伍将
     * @date 2021/2/3
     * @param user:当前登录用户
     * @param examineVO:审核请求参数
     * @return 操作结果
     **/
    Wrapper<Void> examineStepOne(UserLoginCacheDTO user, ContractManageExamineVO examineVO);

    /**
     * 分页查询待审核二级合同列表
     * @author 伍将
     * @date 2021/2/2
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractManageQueryVO>> pageToBeExamineStepTwo(UserLoginCacheDTO user, ContractManageCommonPageVO pageVO);

    /**
     * 二级审核
     * @author 伍将
     * @date 2021/2/3
     * @param user:当前登录用户
     * @param examineVO:审核请求参数
     * @return 操作结果
     **/
    Wrapper<Void> examineStepTwo(UserLoginCacheDTO user, ContractManageExamineVO examineVO);

    /**
     * 分页查询待签订合同列表
     * @author 伍将
     * @date 2021/2/2
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractManageQueryVO>> pageToBeSign(UserLoginCacheDTO user, ContractManageCommonPageVO pageVO);

    /**
     * 签订合同
     * @author 伍将
     * @date 2021/2/7
     * @param user: 当前登录用户
     * @param examineVO: 审核请求参数
     * @return 操作结果
     **/
    Wrapper<Void> sign(UserLoginCacheDTO user, ContractManageExamineVO examineVO);

    /**
     * 获取外部状态列表
     * @author 伍将
     * @date 2021/2/2
     * @return 操作结果
     **/
    Wrapper<List<PageItemVO>> getOuterStatusList();

    /**
     * 获取内部状态列表
     * @author 伍将
     * @date 2021/2/2
     * @return 操作结果
     **/
    Wrapper<List<PageItemVO>> getInnerStatusList();

    /**
     * 分页查询完成合同列表
     * @author 伍将
     * @date 2021/3/11
     * @param user: 当前登录用户
     * @param pageVO: 分页请求参数
     * @return 操作结果
     **/
    Wrapper<PageData<ContractCompleteQueryVO>> pageCompleteList(UserLoginCacheDTO user, ContractManageCommonPageVO pageVO);

    /**
     * 获取合同编号
     * @author 伍将
     * @date 2021/3/26
     * @param oldContractNo: 旧合同编号
     * @return 操作结果
     **/
    Wrapper<String> getContractNo(String oldContractNo);

    /**
     * 获取合同信息（）
     * @param user
     * @param contractId
     * @return
     */
    Wrapper<ContractManageInfoVO> getContractInfo(UserLoginCacheDTO user, Long contractId);

    /**
     * 更新合同剩余金额.
     * @param request
     */
    void updateContractFreeAmount(ContractOrderAmountLogRequest request);

    /**
     * 更新已过期合同的状态
     */
    void updateExpiredContract();
}
